package controllers

import (
	"github.com/gin-gonic/gin" // Web 框架
	"library-system/config"    // 项目配置（含数据库实例）
	"library-system/models"    // 数据模型定义
	"library-system/utils"
	"strconv"
)

// BookController 定义空控制器结构体（用于组织方法）
type BookController struct{}

// controllers/book.go
// @Summary 获取书籍列表
// @Produce json
// @Success 200 {object} utils.Response
// @Router /books [get]
func (bc *BookController) GetBooks(c *gin.Context) {
	var books []models.Book

	if result := config.DB.Find(&books); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "请求参数有误")
		return
	}

	utils.Success(c, "", gin.H{"data": books})
}

// CreateBook 创建书籍（已有代码优化）
func (bc *BookController) CreateBook(c *gin.Context) {
	var book models.Book

	if err := c.ShouldBindJSON(&book); err != nil {
		utils.Error(c, utils.ErrorCode, "无效的请求格式")
		return
	}

	if result := config.DB.Create(&book); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "创建书籍失败")
		return
	}

	utils.Success(c, "", gin.H{"data": book})
}

// UpdateBook 更新书籍
func (bc *BookController) UpdateBook(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		utils.Error(c, utils.ErrorCode, "无效的书籍ID")
		return
	}

	var book models.Book
	if result := config.DB.First(&book, id); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "书籍不存在")
		return
	}

	if err := c.ShouldBindJSON(&book); err != nil {
		utils.Error(c, utils.ErrorCode, "无效的请求数据")
		return
	}

	if result := config.DB.Save(&book); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "更新书籍失败")
		return
	}

	utils.Success(c, "", gin.H{"data": book})
}

// DeleteBook 删除书籍
func (bc *BookController) DeleteBook(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		utils.Error(c, utils.ErrorCode, "无效的书籍ID")
		return
	}

	var book models.Book
	if result := config.DB.First(&book, id); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "书籍不存在")
		return
	}

	if result := config.DB.Delete(&book); result.Error != nil {
		utils.Error(c, utils.ErrorCode, "删除书籍失败")
		return
	}

	//c.Status(http.StatusNoContent) // 204 状态码表示成功无内容返回
	utils.Success(c, "成功删除书籍", nil)
}

// 书籍搜索接口
type BookQuery struct {
	Title  string `form:"title"`
	Author string `form:"author"`
	ISBN   string `form:"isbn"`
	Page   int    `form:"page,default=1"`
	Size   int    `form:"size,default=10"`
}

func (bc *BookController) SearchBooks(c *gin.Context) {
	var query BookQuery
	if err := c.ShouldBindQuery(&query); err != nil {
		utils.Error(c, utils.ErrorCode, "参数错误")
		return
	}

	db := config.DB.Model(&models.Book{})
	if query.Title != "" {
		db = db.Where("title like ?", "%"+query.Title+"%")
	}
	if query.Author != "" {
		db = db.Where("author LIKE ?", "%"+query.Author+"%")
	}
	if query.ISBN != "" {
		db = db.Where("isbn = ?", query.ISBN)
	}

	var total int64
	db.Create(&total)

	var books []models.Book
	db.Offset((query.Page - 1) * query.Size).Limit(query.Size).Find(&books)

	utils.Success(c, "查询成功", gin.H{
		"data":  books,
		"total": total,
		"page":  query.Page,
		"size":  query.Size,
	})
}
